from django.shortcuts import render
from django.views import View

from django.http import JsonResponse, HttpResponse
#获取一个redis的连接对象
from django_redis import get_redis_connection
from verifications.libs.captcha.captcha import captcha
# from verifications.libs.yuntongxun.ccp_sms import CCP
from celery_tasks.sms.tasks import ccp_send_sms_code

# Create your views here.
import random, re
#图形验证码
class ImageCodeView(View):
    def get(self, request, uuid):
        """
        实现图形验证码逻辑
        :param request:
        :param uuid: UUID
        :return:  image/jpg
        """
        #生成图形验证码
        text, image = captcha.generate_captcha()
        #保存图形验证码
        try:
            #使用配置的redis数据库的别名，创建链接到redis的对象
            conn = get_redis_connection('verify_code')
            #使用链接到redis的对象去操作数据存储到redis
            #图形验证码必须要有有效期的，美多商城的设计是３００秒有效期
            conn.setex('img_%s' % uuid, 300, text)
        except Exception as e:
            print(e)
            return JsonResponse({'code': 400, 'errmsg': 'redis写入图形验证码失效'})
        #响应图形验证码：image/jpg
        return HttpResponse(image, content_type='image/jpg')


#短信验证码
class SMSCodeView(View):
    def get(self, request, mobile):
        """
        :param request: 请求对象
        :param mobile: 　手机号
        :return: JSON
        """
        #1、接收参数
        image_code = request.GET.get('image_code')
        uuid = request.GET.get('image_code_id')
        #2、校验参数
        if not all([image_code, uuid]):
            return JsonResponse({'code': 400, 'errmsg': '缺少必传参数！'})
        if not re.match(r'^[a-zA-Z0-9]{4}$', image_code):
            return JsonResponse({'code': 400, 'errmsg': '图形验证码格式有误！'})
        if not re.match(r'^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$', uuid):
            return JsonResponse({'code': 400, 'errmsg': 'uuid格式有误！'})
        #图形验证码校验－－根据uuid获取redis中的图形验证码，和用户填写的比对
        conn = get_redis_connection('verify_code')  #2号redis库
        text = conn.get('img_%s' % uuid)
        #为了保证图片验证码之后被使用一次，只需要读一次立刻删除
        conn.delete('img_%s' % uuid)
        if not text:
            #如果图形验证码过期，text返回为空
            return JsonResponse({'code': 400, 'errmsg': '图形验证码过期'})
        #统一转化小写对比
        if image_code.lower() != text.decode().lower():
            return JsonResponse({'code': 400, 'errmsg': '图形验证码错误！'})
        #发短信之前校验标志信息是否存在
        flag = conn.get('send_flag_%s' % mobile)
        if flag:
            #flage存在则说明６０秒之内发送过短信
            return JsonResponse({'code': 400, 'errmsg': '请勿频繁发送短信！'})
        #生成固定６位数长度的０－９字符组成的验证码
        sms_code = "%06d" % random.randrange(0,999999)
        print('短信：', sms_code)

        #获取redis的pipeline对象
        p = conn.pipeline()
        #使用pipeline对象方法实现调用指令
        p.setex('sms_%s' % mobile, 300, sms_code)
        p.setex('send_flag_%s' % mobile, 60, 1)
        #提交pipeline把指令通过一次网络通信发送给redis执行
        p.execute()
        #使用异步的方式发送短信
        ccp_send_sms_code.delay(mobile, sms_code)

        # 10、构建响应
        return JsonResponse({'code': 0,
                             'errmsg': '发送短信成功'})


